package com.peaksport.framework.extend.servicecomb;

import java.text.FieldPosition;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.servicecomb.common.rest.codec.RestObjectMapper;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.util.ISO8601DateFormat;
import com.peaksport.framework.util.PKPublicUtils;

/**
 * 自定义序列化格式:
 *  1. 日期格式统一为 yyyy-MM-dd HH:mm:ss 如: 2019-01-25 18:03:30
 *  2. 仅序列化非空not-null的对象
 *  
 *  PS:序列化自定义格式尽量与PKRestObjectMapper保持一致
 *  
 * @author jinbin_guo  2019年4月10日 下午3:07:32
 *
 */
@SuppressWarnings({ "serial", "deprecation" })
public class PKRestObjectMapper extends RestObjectMapper {

	public PKRestObjectMapper() {
		super();
		//swagger对于日期的格式有要求，是ISO8601格式。
		//如果consumer和provider两端都修改为另外的格式并且保持一致的话，应该也能调通，不过接口就不符合swagger标准了
		SimpleDateFormat sf = PKPublicUtils.SDF_YYYYMMDD_HHMMSS;
		setDateFormat(new ISO8601DateFormat() {
			//序列化、反序列化要同时实现,否则会有异常
			@Override
			public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
				String value = sf.format(date);
				toAppendTo.append(value);
			    return toAppendTo;
			}
			@Override
			public Date parse(String source) throws ParseException {
				return sf.parse(source);
			}
		});
		//序列化非空not-null的对象
		setSerializationInclusion(Include.NON_NULL);
	}
}
